package com.aaa.system.controller.api;

import com.aaa.system.aop.annotation.Log;
import com.aaa.system.service.UserService;
import com.aaa.system.utils.AliyunUtil;
import com.aaa.system.vo.PasswordVo;
import com.aaa.system.vo.UserVo;
import com.alibaba.fastjson.JSON;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.aaa.entity.User;
import com.aaa.vo.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.util.UUID;

/**
 * 响应到前端的controller类
 */
@RestController
@RequestMapping("system/api/user")
public class ApiUserController {

    @Autowired
    private UserService userService;

    /**
     * 查询登录用户的信息，填写到页面右上角
     * @return
     */
    @GetMapping("/info")
    public Result<User> getInfo(){
        return userService.getUserInfo();
    }


    /**
     * 分页动态查询所有用户信息
     * @param current  当前页
     * @param size   每页显示的条数
     * @param userVo  查询的条件对象
     * @return
     */
    @PostMapping("/selectAll/{current}/{size}")
    public Result<IPage<User>> selectAll(
            @PathVariable Integer current,
            @PathVariable Integer size,
            @RequestBody UserVo userVo
    ){
        return userService.findByCondition(current,size,userVo);
    }

    /**
     * 添加或修改用户信息
     * @param user 用户信息
     * @return
     */
    @Log(title = "添加/修改用户信息",business_type = "2")
    @PostMapping("/saveOrUpdateUser")
    public Result<Boolean> saveOrUpdateUser(@RequestBody User user){
        return userService.saveOrUpdateUser(user);
    }


    /**
     * 根据用户id删除用户信息
     * @param userId 用户id
     * @return
     */
    @Log(title = "删除单个用户",business_type = "3")
    @DeleteMapping("/delUser/{userId}")
    public Result<Boolean> delUser(@PathVariable Long userId){
        return userService.delUser(userId);
    }

    /**
     * 根据用户id数组批量删除用户信息
     * @param userIds  用户信息数组
     * @return
     */
    @Log(title = "批量删除用户",business_type = "3")
    @PostMapping("/muldelUser/{userIds}")
    public Result<Boolean> muldelUser(@PathVariable Long[] userIds){
        return userService.muldelUser(userIds);
    }

    /**
     * 表单中填写手机号时，要验证数据库中是否已经有此手机号，如果有就提示已存在
     * @param checkphone  手机号
     * @return
     */
    @PostMapping("/checkPhone/{checkphone}")
    public Result<String> checkPhone(@PathVariable String checkphone){
        return  userService.checkPhone(checkphone);
    }

    /**
     * 当前登录用户修改密码的方法
     * @param passwordVo 修改密码的接收对象
     * @return 操作结果
     */
    @PostMapping("revisePassWord")
    public Result<Boolean> revisePassWord(@RequestBody PasswordVo passwordVo){
        return userService.revisePassWord(passwordVo);
    }

    /**
     * 退出系统，清除redis中的token缓存
     * @return 操作结果信息
     */
    @GetMapping("quitSystem")
    public Result<String> quitSystem(){
        return userService.quitSystem();
    }

    /**
     * 用户添加时上传头像到阿里云OSS
     * @param file  文件
     * @param request 请求
     * @return 结果信息
     */
    @PostMapping("uploadFile")
    public Result<String> uploadFile(MultipartFile file, HttpServletRequest request){
        String endpoint = AliyunUtil.END_POINT;
        // 阿里云账号AccessKey拥有所有API的访问权限，风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维，请登录RAM控制台创建RAM用户。
        String accessKeyId = AliyunUtil.ACCESS_KEY_ID;
        String accessKeySecret = AliyunUtil.ACCESS_KEY_SECRET;
        // 填写Bucket名称，例如examplebucket。
        String bucketName = AliyunUtil.BUCKET_NAME;
        // 填写Object完整路径，完整路径中不能包含Bucket名称，例如exampledir/exampleobject.txt。
        String oldname = file.getOriginalFilename();

        // 取一个新的名字
        String s = UUID.randomUUID().toString();
        // 获取原来原始名字的后缀
        int i = oldname.lastIndexOf(".");
        String suffixName = oldname.substring(i);
        System.out.println("原始文件名字的后缀suffixName = " + suffixName);
        // 随机数+原始名字后缀获得一个不会重复的新名字
        // String newname = s + suffixName;
        String objectName = s + suffixName;
        // 创建OSSClient实例。
        OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);

        try {
            // 创建PutObjectRequest对象。
            PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, objectName, file.getInputStream());
            // 上传字符串。
            ossClient.putObject(putObjectRequest);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        String picturePath = "https://"+bucketName+"."+endpoint+"/"+objectName;
        // 这里需要返回的是一个LayData类型的数据，否则layui接受的数据格式不对，会导致异常
        return new Result<>(200,"上传头像成功",picturePath);
    }


}
